// Copyright 2021 by 马万里. All rights reserved.
// 开发团队 ：   鸡中之霸
// 开发人员 ：   马万里
// 开发时间 ：   2021/2/24 16:49
// 文件名称 ：   user.go
// 工程名称 ：   netpan
// 开发工具 ：   GoLand
//

package handler

import (
	"fmt"
	"github.com/gin-gonic/gin"
	myDB "johnsonsmile.cn/netpan/db"
	util "johnsonsmile.cn/netpan/utils"
	"net/http"
	"time"
)

const (
	pwd_salt = "#890"
)

// SignUpHandler: 注册(get)
func SignUpHandler(c *gin.Context) {
	c.Redirect(http.StatusFound, "static/view/signup.html")
}

// DoSignUpHandler: 注册的post
func DoSignUploader(c *gin.Context) {

	username := c.Request.FormValue("username")
	password := c.Request.FormValue("password")
	if len(username) < 3 || len(password) < 5 {
		c.JSON(http.StatusOK, gin.H{
			"msg":  "Invalid parameter",
			"code": -1,
		})
		return
	}
	enc_pwd := util.Sha1([]byte(pwd_salt + password))
	suc := myDB.UserSignUp(username, enc_pwd)
	if suc {
		c.JSON(http.StatusOK, gin.H{
			"msg":  "Signup success!",
			"code": 0,
		})
	} else {
		c.JSON(http.StatusOK, gin.H{
			"msg":  "Signup failed",
			"code": -1,
		})
	}
}

// SignInHandler: 登录接口
func SignInHandler(c *gin.Context) {
	c.Redirect(http.StatusFound, "static/view/signup.html")
}

// DoSignInHandler: 登录post请求
func DoSignInHandler(c *gin.Context) {

	// 1. 校验用户名及密码
	username := c.Request.FormValue("username")
	password := c.Request.FormValue("password")

	encPasswd := util.Sha1([]byte(pwd_salt + password))
	suc := myDB.UserSignIn(username, encPasswd)
	if !suc {
		c.JSON(http.StatusOK, gin.H{
			"msg":  "Sign in failed!",
			"code": -1,
		})
		return
	}

	// 2.生成token
	token := GenToken(username)
	upRes := myDB.UpdateToken(username, token)
	if !upRes {
		c.JSON(http.StatusOK, gin.H{
			"msg":  "Sign in failed!",
			"code": -1,
		})
		return
	}

	// 3.登录成功后重定向到首页
	resp := util.RespMsg{
		Code: 0,
		Msg:  "OK",
		Data: struct {
			Location string
			Username string
			Token    string
		}{
			Location: "/static/view/home.html",
			Username: username,
			Token:    token,
		},
	}
	//c.JSON(http.StatusOK, resp.JSONBytes())
	c.Data(http.StatusOK, "application/json", resp.JSONBytes())
}

// UserInfoHandler: 获取用户信息接口
func UserInfoHandler(w http.ResponseWriter, r *http.Request) {
	// 1. 解析请求参数
	r.ParseForm()
	username := r.Form.Get("username")
	//token := r.Form.Get("token")

	// 2. 验证token
	//isValid := IsTokenValid(token)
	//if !isValid {
	//	w.WriteHeader(http.StatusForbidden)
	//	return
	//}

	// 3. 查询用户信息
	user, err := myDB.GetUserInfo(username)
	if err != nil {
		w.WriteHeader(http.StatusForbidden)
		return
	}
	// 4. 返回响应数据
	resp := util.RespMsg{
		Code: 0,
		Msg:  "OK",
		Data: user,
	}

	w.Write(resp.JSONBytes())
}

// GenToken: 生成token
func GenToken(username string) string {
	// md5(username + timestamp + token_salt) + timestamp[:8]
	ts := fmt.Sprintf("%x", time.Now().Unix())
	tokenPrefix := util.MD5([]byte(username + ts + "_tokensalt"))
	return tokenPrefix + ts[:8]
}

// IsTokenValid: 验证token
func IsTokenValid(token string) bool {

	if len(token) != 40 {
		return false
	}

	// TODO: 判断token的时效性，是否过期
	// example，假设token的有效期为1天   (根据同学们反馈完善, 相对于视频有所更新)
	//tokenTS := token[:8]
	//if util.Hex2Dec(tokenTS) < time.Now().Unix()-86400 {
	//	return false
	//}

	// TODO: 从数据库中查询,看是否一致
	return true
}
